package Entity;

import java.math.BigDecimal;

/**
 * 直播商品关联表实体类（对应livestream_product表）
 * 复合主键（streamId, productId），click_rate为自动计算字段
 */
public class LivestreamProduct {
    // 关联直播ID（复合主键之一，非空，外键关联livestream.stream_id）
    private Integer streamId;
    // 关联商品ID（复合主键之一，非空，外键关联product.product_id）
    private Integer productId;
    // 商品曝光次数（非负，UNSIGNED，默认0）
    private Integer exposureCount;
    // 商品点击次数（非负，UNSIGNED，默认0，不超过曝光次数）
    private Integer clickCount;
    // 本场销量（非负，UNSIGNED，默认0）
    private Integer salesVolume;
    // 点击率（自动计算：IF(exposure_count=0, 0, click_count/exposure_count)，DECIMAL(6,4)）
    private BigDecimal clickRate;

    // 无参构造（必需）
    public LivestreamProduct() {}

    // Getter/Setter
    public Integer getStreamId() {
        return streamId;
    }

    public void setStreamId(Integer streamId) {
        this.streamId = streamId;
    }

    public Integer getProductId() {
        return productId;
    }

    public void setProductId(Integer productId) {
        this.productId = productId;
    }

    public Integer getExposureCount() {
        return exposureCount;
    }

    public void setExposureCount(Integer exposureCount) {
        // 业务层保证非负（适配UNSIGNED），默认0
        if (exposureCount == null) {
            this.exposureCount = 0;
            return;
        }
        if (exposureCount < 0) {
            throw new IllegalArgumentException("exposureCount（曝光次数）不能为负数");
        }
        this.exposureCount = exposureCount;
        // 同步更新点击率（自动计算逻辑）
        updateClickRate();
    }

    public Integer getClickCount() {
        return clickCount;
    }

    public void setClickCount(Integer clickCount) {
        // 业务层保证非负且不超过曝光次数（适配UNSIGNED），默认0
        if (clickCount == null) {
            this.clickCount = 0;
            updateClickRate();
            return;
        }
        if (clickCount < 0) {
            throw new IllegalArgumentException("clickCount（点击次数）不能为负数");
        }
        if (this.exposureCount != null && clickCount > this.exposureCount) {
            throw new IllegalArgumentException("clickCount（点击次数）不能超过exposureCount（曝光次数）");
        }
        this.clickCount = clickCount;
        // 同步更新点击率（自动计算逻辑）
        updateClickRate();
    }

    public Integer getSalesVolume() {
        return salesVolume;
    }

    public void setSalesVolume(Integer salesVolume) {
        // 业务层保证非负（适配UNSIGNED），默认0
        if (salesVolume == null) {
            this.salesVolume = 0;
            return;
        }
        if (salesVolume < 0) {
            throw new IllegalArgumentException("salesVolume（销量）不能为负数");
        }
        this.salesVolume = salesVolume;
    }

    public BigDecimal getClickRate() {
        return clickRate;
    }

    // 禁止手动设置点击率（由exposureCount和clickCount自动计算）
    private void setClickRate(BigDecimal clickRate) {
        this.clickRate = clickRate;
    }

    // -------------------------- 自动计算点击率（匹配MySQL的GENERATED ALWAYS AS逻辑） --------------------------
    private void updateClickRate() {
        if (this.exposureCount == null || this.exposureCount == 0) {
            this.setClickRate(BigDecimal.ZERO.setScale(4)); // 曝光为0时，点击率0.0000
        } else if (this.clickCount == null) {
            this.setClickRate(BigDecimal.ZERO.setScale(4)); // 点击为null时，点击率0.0000
        } else {
            // 计算点击率：clickCount / exposureCount，保留4位小数（匹配DECIMAL(6,4)）
            BigDecimal rate = new BigDecimal(this.clickCount)
                    .divide(new BigDecimal(this.exposureCount), 4, BigDecimal.ROUND_HALF_UP);
            this.setClickRate(rate);
        }
    }

    // toString（调试用）
    @Override
    public String toString() {
        return "LivestreamProduct{" +
                "streamId=" + streamId +
                ", productId=" + productId +
                ", exposureCount=" + exposureCount +
                ", clickCount=" + clickCount +
                ", salesVolume=" + salesVolume +
                ", clickRate=" + clickRate +
                '}';
    }
}